﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using LinqProviders.Utility;

namespace LinqProviders.LinqToNaver
{
    /// <summary>
    /// 카페검색
    /// </summary>
    public class CafeSearchResult : NaverSearchResult
    {
        public string Rss { get; private set; }
        public string CnTitle { get; private set; }
        public Uri CnLink { get; private set; }
        public String CnDescription { get; private set; }
        public DateTime LastBuildDate { get; private set; }


        /// <summary>
        /// Gets or sets the sort.
        /// </summary>
        /// <value>The sort. 정렬옵션입니다, sim : 유사도순 (기본값), member : 멤버수 순, newarticles : 최근 등록된 글 수 순, rank : 카페 랭킹순</value>
        public string Sort { get; set; }


        public string Title { get; private set; }
        /// <summary>
        /// Gets or sets the link.검색 결과 문서의 하이퍼텍스트 link를 나타냅니다.
        /// 사전 정의 정보 및 추가 정보를 볼 수 있는 link를 제공합니다.link값은 두산 백과사전 사이트의 해당 페이지로 연결됩니다.
        /// </summary>
        /// <value>The link.</value>
        public Uri Link { get; private set; }

        /// <summary>
        /// Gets or sets the description.
        /// 검색 결과 문서의 내용을 요약한 패시지 정보입니다. 문서 전체의 내용은 link를 따라가면 읽을 수 있습니다. 패시지에서 검색어와 일치하는 부분은 <b>태그로 감싸져 있습니다. 
        /// </summary>
        /// <value>The description.</value>
        public string Description { get; private set; }


        /// <summary>
        /// Gets or sets the ranking.
        /// 검색된 카페의 카페 랭킹입니다.
        /// </summary>
        /// <value>The ranking.</value>
        public string Ranking { get; private set; }

        /// <summary>
        /// Gets or sets the member.
        /// 검색된 카페의 회원 수입니다.
        /// </summary>
        /// <value>The member.</value>
        public int Member { get; private set; }

        /// <summary>
        /// Gets or sets the total articles.
        /// 검색된 카페에 게시된 총 글 수 입니다.
        /// </summary>
        /// <value>The total articles.</value>
        public int TotalArticles { get; set; }

        /// <summary>
        /// Gets or sets the new articles.
        /// 검색된 카페에 새로 게시된 글 수입니다.
        /// </summary>
        /// <value>The new articles.</value>
        public int NewArticles { get; set; }

        /// <summary>
        /// Gets the channel query.
        /// </summary>
        /// <param name="xdoc">The xdoc.</param>
        /// <returns></returns>
        private  IEnumerable<CafeSearchResult> Parse(string input)
        {
            if (string.IsNullOrEmpty(input))
                return null;

            XDocument xdoc = XDocument.Parse(input);
            var chan = xdoc.Descendants("channel").FirstOrDefault();
            if (chan == null)
                return null;

            
            Channel rootChannel = new Channel();
            rootChannel.Title = chan.Element("title")!=null ?  chan.Element("title").Value : string.Empty ;
            rootChannel.Link = ConversionHelpers.ToUri(chan.Element("link")!=null ?  chan.Element("link").Value : "http://" );
            rootChannel.Description = chan.Element("description") != null ? chan.Element("description").Value : "";
            rootChannel.Total = int.Parse(chan.Element("total") != null ? chan.Element("total").Value : "0");
            rootChannel.Display = int.Parse(chan.Element("display") != null ? chan.Element("display").Value : "0");
            rootChannel.Start = int.Parse(chan.Element("start") != null ? chan.Element("start").Value : "0");
            rootChannel.LastBuildDate = DateTime.Parse(chan.Element("lastBuildDate") != null ? chan.Element("lastBuildDate").Value : DateTime.Now.ToString());

            return from items in chan.Descendants("item")
                   select new CafeSearchResult
                   {
                       CnTitle = rootChannel.Title,
                       CnLink = rootChannel.Link,
                       CnDescription = rootChannel.Description,
                       LastBuildDate = rootChannel.LastBuildDate,
                       Total = rootChannel.Total,
                       Display = rootChannel.Display,
                       Start = rootChannel.Start,
                       Title = items.Element("title") != null ? items.Element("title").Value : "",
                       Link = ConversionHelpers.ToUri(items.Element("link") != null ? items.Element("link").Value : "http://"),
                       Description = items.Element("description") != null ? items.Element("description").Value : string.Empty,
                       Ranking = items.Element("ranking") != null ? items.Element("ranking").Value : "0",
                       Member = items.Element("member") != null ? Int32.Parse(items.Element("member").Value) : 0,
                       TotalArticles = items.Element("totalarticles") != null ? Int32.Parse(items.Element("totalarticles").Value) : 0,
                       NewArticles = items.Element("newarticles") != null ? Int32.Parse(items.Element("newarticles").Value) : 0
                   };
        }

        protected override object Parse(string input, string requestedQuery, out int count, out int totalCount)
        {
            IEnumerable<CafeSearchResult> resultList = new List<CafeSearchResult>();
            count = 0;
            totalCount = 0;

            if (String.IsNullOrEmpty(input) == false)
            {
                resultList = Parse(input);
            }

            totalCount = resultList.FirstOrDefault() != null ? resultList.FirstOrDefault().Total : 0;

            return resultList;
        }
    }

}
